import org.kwis.msp.lcdui.*;
import org.kwis.msp.lwc.*;

public class Block implements GameConstants 
{
	private Image BlockRed, BlockGreen, BlockBlue, BlockYellow, BlockGrey;
	private int stageNo;
	private int stage[][] = null;

	public Block(int No)
	{
		try
		{
			BlockRed = Image.createImage("block_red.png");
			BlockGreen = Image.createImage("block_green.png");
			BlockBlue = Image.createImage("block_blue.png");
			BlockYellow = Image.createImage("block_yellow.png");
			BlockGrey = Image.createImage("block_grey.png");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		stageNo = No;
		stage = Stages.getStages(stageNo);
	}

	public int getStageNo()
	{
		return stageNo;
	}

	// 화면에 블록들을 그려준다.
	// Stage클래스로 부터 받은 배열을 사용하여
	// 화면에 블록들을 그려준다.
	public void paint(Graphics g)
	{
		int x=0, y=0;

		for (int i=0 ; i < BLOCK_ROW; i++)
		{
			for (int j=0 ; j < BLOCK_COLUMN ; j++ )
			{
				switch(stage[i][j]) 
				{
					case 1 : // 녹색
						g.drawImage(BlockGreen,x,y,Graphics.TOP); break;
					case 2 : // 노랑색
						g.drawImage(BlockYellow,x,y,Graphics.TOP); break;
					case 3 : // 파랑색
						g.drawImage(BlockBlue,x,y,Graphics.TOP); break;
					case 4 : // 빨강색
						g.drawImage(BlockRed,x,y,Graphics.TOP); break;
					case 5 : // 회색
						g.drawImage(BlockGrey,x,y,Graphics.TOP); break;
					default :
						break;
				}
				x += BLOCK_WIDTH;
			}
			x = 0;
			y += BLOCK_HEIGHT;
		}
	}

	// 블록들과 공의 충돌검사
	// return 값
	// BLOCK_HIT_NONE : 충동이 안된경우
	// BLOCK_HIT_NORMAL : 위나 아래에 충돌이 된경우
	// BLOCK_HIT_EDGE : 옆이나 모서리에 충돌이 된경우
	// BLOCK_HIT_NOMOREBLOCKS : 모든 블록이 없어진경우
	public int hitTest(int ballX, int ballY, int deltaX, int deltaY)
	{
		// 공이 오른쪽으로 가는 경우
		if(deltaX > 0) 
			ballX = ballX + BALL_DIAMETER;
		// 공이 왼쪽으로 가는 경우
		if(deltaY > 0)
			ballY = ballY + BALL_DIAMETER;

		int x=0 ,y=0;
		boolean thereisBlock = false;
	
		for (int i=0 ; i < BLOCK_ROW; i++)
		{
			for (int j=0 ; j < BLOCK_COLUMN ; j++ )
			{
				// 남아있는 블럭의 갯수를 카운트한다.
				if(stage[i][j] != 0) thereisBlock = true;

				// 현재 볼의 좌표와 충돌하는 블록영역을 검사를 하여, 현재의 
				// 공의 좌표가 [i][j]의 블록 영역안에 속해있는 경우
				if( (x <= ballX && ballX <= x+BLOCK_WIDTH) && ( y <= ballY && ballY <= y+BLOCK_HEIGHT) ) 
				{
					// 그 영역에 있는 블록이 이미 지워진 블록이 아닌경우에는
					if (stage[i][j] != 0 )
					{
						// 블록의 life을 하나 감소시킨다.
						if (stage[i][j]>0)
						{
							//stage[i][j]--;
							stage[i][j] = 0;
						}

						// EDGE 충돌 테스트를 한다.
						// 공이 오른쪽으로 가는경우
						if(deltaX > 0) {
							if ( ballX == x )
							{
								return BLOCK_HIT_EDGE;
							}
						}
						// 공이 왼쪽으로 가는경우
						else {
							if ( ballX == x+BLOCK_WIDTH )
							{
								return BLOCK_HIT_EDGE;
							}
						}
						// EDGE가 아니면 위 아래 충돌로 돌려준다.
						return BLOCK_HIT_NORMAL;
					}
				}
				x += BLOCK_WIDTH;
			}
			x = 0;
			y += BLOCK_HEIGHT;
		}

		// 만약 블록이 하나도 없다면
		// BLOCK_HIT_NOMOREBLOCKS 를 리턴후
		// 스테이지를 종료한다.
		if (!thereisBlock)
			return BLOCK_HIT_NOMOREBLOCKS;
		else
			return BLOCK_HIT_NONE;
	}
};